#include <iostream>

//顺序表的实现
class sequenceList
{
private:
    float* myList;//数组
    int curNumberOfItem;//当前顺序表的元素个数
    int maxCapcity;//顺序表的容量
    
public:
    sequenceList(const int&, const int&, float[]);
    ~sequenceList();

    bool addItem(const float&);
    bool insertItem(const int&,const float&);
    int deleteItem(const float&);
    bool locate(const int&, float&);
    int locate(const float&);
    void reverse();
    void print();
};



class linkList;
//listNode中只有一个next指针,表明是单链表
class listNode
{
    friend class linkList;
    friend void merge(linkList&, linkList&);
private:
    float data;
    listNode* next;
    
public:
    listNode(){next = NULL;}
    listNode(float nodeData, listNode* succ = NULL);
    ~listNode();
};

class linkList
{
    friend void merge(linkList&, linkList&);//这里必须要把merge函数设置为linkList的友元函数,这是.h文件中唯一添加的地方
private:
    listNode* firstNode;//指向链表的头节点的指针(注意指向的是头节点而不是首元结点),即firstNode就是头指针
    listNode* curNode;//指向当前操作的节点的指针(一定要明白这不是节点)
    listNode* lastNode;//指向尾节点的指针(尾节点不像头结点一样不包含数据)

    int listSize;//链表的大小，表示链表中包含的节点数量
public:
    linkList();
    linkList(const int&, float[]);
    ~linkList();

    bool headInsertItem(const float&);          //按值头插
    bool tailInsertItem(const float&);          //按值尾插
    int insertItem(const int&,const float&);    //插入特定位置
    int deleteItem(const float&);               //按值删除
    bool locate(const int&, float&);            //按位查找
    int locate(const float&);                   //按值查找
    void ascendingOrder();                      //升序
    void reverse();                             //倒排
    void print();                               //打印元素
    
};

void merge(linkList&, linkList&);

